package br.org.desa.agendaescolar.bean;

import java.io.Serializable;
import java.util.ArrayList;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.Enumerated;

import br.org.desa.agendaescolar.controlador.CompromissoControle;
import br.org.desa.agendaescolar.controlador.UsuarioControle;
import br.org.desa.agendaescolar.modelo.Compromisso;
import br.org.desa.agendaescolar.modelo.Usuario;

@ManagedBean(name="Professor")
@SessionScoped
public class ProfessorBean implements Serializable {
	@ManagedProperty(value="#{Sessao}")
	private SessaoBean sessao;
	private String horarioCompromisso;
	private int unidade;
	private Date dataCompromisso = new Date();
	private List<Compromisso> compromissos = new ArrayList<Compromisso>();
	private List<Usuario> alunos = new ArrayList<Usuario>();
	private CompromissoControle compromissoControle = new CompromissoControle();
	private UsuarioControle usuarioControle = new UsuarioControle();
		
		public ProfessorBean(){}
		
	
	public SessaoBean getSessao() {
		return sessao;
	}

	public void setSessao(SessaoBean sessao) {
		this.sessao = sessao;
	}

	public String getHorarioCompromisso() {
		return horarioCompromisso;
	}

	public void setHorarioCompromisso(String horarioCompromisso) {
		this.horarioCompromisso = horarioCompromisso;
	}
	
	public int getUnidade() {
		return unidade;
	}

	public void setUnidade(int unidade) {
		this.unidade = unidade;
	}


	public Date getDataCompromisso() {
		return dataCompromisso;
	}

	public void setDataCompromisso(Date dataCompromisso) {
		this.dataCompromisso = dataCompromisso;
	}

	public List<Compromisso> getCompromissos() {
		return compromissos;
	}

	public void setCompromissos(List<Compromisso> compromissos) {
		this.compromissos = compromissos;
	} 
	
	public List<Usuario> getAlunos() {
		return alunos;
	}

	public void setAlunos(List<Usuario> alunos) {
		this.alunos = alunos;
	}

	
	//METODOS GERAIS 
	public void cadastraCompromisso(){
		int hora = Integer.parseInt(horarioCompromisso.substring(0, 2));
		int minutos = Integer.parseInt(horarioCompromisso.substring(3, 5));
		dataCompromisso.setHours(hora);
		dataCompromisso.setMinutes(minutos);
		
		GregorianCalendar cal = new GregorianCalendar();
		cal.setTime(dataCompromisso);
		
		Compromisso compromisso = new Compromisso();
		compromisso.setProfessor(this.sessao.getUsuario());
		compromisso.setDisponivel(true);
		compromisso.setDataHora(cal);
		compromisso.setUnidade(unidade);
		
		FacesContext contexto = FacesContext.getCurrentInstance();
		if (compromissoControle.cadastrarCompromisso(compromisso)){
			contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Cadastro realizado com sucesso.", ""));
		}else{
			contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Falha ao cadastrar compromisso, não é permitido cadastrar aulas com datas e horários iguais", ""));
		}
		
		compromissoControle.desativaCompromissosPassados();
		compromissos.clear();
		compromissos.addAll(compromissoControle.listaCompromissosDisponiveis("true"));
	}
	
	public void removeCompromisso(){
		
		FacesContext context = FacesContext.getCurrentInstance();
		Map<String, String> params = context.getExternalContext().getRequestParameterMap();
		int codigo = Integer.parseInt(params.get("Codigo"));;
		
		for (Compromisso compromisso : compromissos){
			if (compromisso.getCodigo() == codigo){
				compromissoControle.removerCompromisso(codigo);
				break;
			}
		}
		compromissos.clear();
		compromissos.addAll(compromissoControle.listaCompromissos());
	}

	public void cancelaCompromisso(){
		FacesContext contexto = FacesContext.getCurrentInstance();
		Map<String, String> params = contexto.getExternalContext().getRequestParameterMap();
		int codigo = Integer.parseInt(params.get("Codigo"));;
		
		for (Compromisso compromisso : compromissos){
			if (compromisso.getCodigo() == codigo){
				compromisso.setAluno(null);
				compromisso.setDisponivel(true);
				compromisso.setDataHoraAgendamentoAluno(null);
				compromissoControle.alterarCompromisso(compromisso);
				contexto.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Cancelamento realizado com sucesso", ""));
				break;
			}
		}
		compromissos.clear();
		compromissos.addAll(compromissoControle.listaCompromissos());
	}
	
	public void limpaSenha(){
		FacesContext contexto = FacesContext.getCurrentInstance();
		Map<String, String> params = contexto.getExternalContext().getRequestParameterMap();
		int codigo = Integer.parseInt(params.get("Codigo"));;
		
		for (Usuario aluno : alunos){
			if(aluno.getCodigo() == codigo){
				aluno.setSenha("senha");
				usuarioControle.alterarUsuario(aluno);
				break;
			}
		}
		alunos.clear();
		alunos.addAll(usuarioControle.listaAlunos());
	}
	
	public void listaCompromissosDisponiveis(ActionEvent e){
		compromissos.clear();
		compromissos.addAll(compromissoControle.listaCompromissosDisponiveis("true"));
	}
	
	public void listaTodosCompromissos(ActionEvent e){
		compromissos.clear();
		compromissos.addAll(compromissoControle.listaCompromissos());
	}
	
	public void listaTodosAlunos(ActionEvent e){
		alunos.clear();
		alunos.addAll(usuarioControle.listaAlunos());
	}
		
	
}
